#ifndef NC_H
#define NC_H

#include <QWidget>
#include <QtCore>
#include <sqlite3.h>
#include "QDataWidgetMapper"
#include "QStringListModel"
#include "QTableView"
#include "sve_network.h"
#include "key_generator.h"
#include "ballot_generator.h"
#include "counter.h"
#include "padron.h"
//#include "pvid_authority.h"
#include "mociones.h"
#include "propuestas.h"
#include "printer.h"

namespace Ui {
    class NC;
}

class NC : public QWidget
{
    Q_OBJECT

public:
// Variables y Objetos
    sve_network *server;
    key_generator *KG;
    ballot_generator *BG;
    Counter *C;
    Padron *P;
    PVID_Authority *PVID_A;
    mociones *moc;
    propuestas *prop;
    printer *myPrinter;

// Funciones

    explicit NC(QWidget *parent = 0);
    ~NC();
    void Init();



private:
// Variables y Objetos
    int tipo_voto;

    Ui::NC *ui;

// Funciones
    QString ajust_text(QString data, int width);

    // Funciones relacionadas con la pantalla de ingreso de propuestas
    void show_prop_opc3();
    void show_prop_opc4();
    void show_prop_opc5();

    // Funciones relacionadas con la pantalla de ingreso de mociones
    void show_moc_opc3();
    void show_moc_opc4();
    void show_moc_opc5();

    // Funciones relacionadas con la pantalla de funcion de propuestas o mociones
    void chk_listWidgets();
    int show_msg(QString message,QString info ="",QString detail = "", QMessageBox::Icon icono = QMessageBox::Information,QMessageBox::StandardButtons buttons=QMessageBox::Ok);


private slots:

    // Slots para el menu principal
    void W_propuestas();
    void W_padron();
    void W_votaciones();
    void W_configuracion();
    void W_cerrar();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Control de propuestas
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void show_prop();
    void show_sub_prop();

    // Slots de la pantalla de ingreso de propuestas
    void conex_ing_prop();
    void opciones_prop_checkBx();
    void opc3_prop_checkBx();
    void opc4_prop_checkBx();

    void opc5_prop_checkBx();

    void acept_prop_button();
    void cancel_prop_button();
    void favor_prop_checkBx();

    // Slots de la pantalla de ingreso de mociones
    void conex_ing_moc();
    //void opciones_moc_checkBx();
    void opc3_moc_checkBx();
    void opc4_moc_checkBx();
    void opc5_moc_checkBx();
    void acept_moc_button();
    void cancel_moc_button();
    void show_moc();
    void show_sub_moc();
    void opciones_moc();
    void favor_moc();

    //Slots de la pantalla de fusion de propuestas
    void conex_fusion_prop();
    void fusion_prop_radioButton();
    void fusion_moc_radioButton();
    void fusion_agregar_button();
    void fusion_eliminar_button();
    void fusion_cancelar_button();
    void fusion_fusionar_button();

    //Slots de la pantalla de división de propuesta
    void conex_div_prop();
    void div_cancelar_button();
    void div_dividir_button();
    void div_prop_RadioButton();
    void div_moc_RadioButton();

    //Slots de la pantalla de eliminar propuesta
    void conex_elim_prop();
    void elim_regresar_button();
    void elim_eliminar_button();
    void elim_prop_RadioButton();
    void elim_moc_RadioButton();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Control de padrón
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    //Slots de la pantalla de ingreso del padrón
    void conex_ing_padron();
    void padron_agregar();
    void padron_borrar_padron();
    void padron_borrar_asambleista();
    void padron_regresar_button();

    //Slots de la pantalla de Registro de Asambleista
    void conex_registro_asambleista();
    void registro_regresar_button();
    void registro_entrada_button();
    void registro_salida_button();
    void registro_cambio_label();

    // Slot para restaurar la sesion de la asamblea
    void reiniciar_sesion();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Control de Votaciones
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    //Slots de la pantalla de inicio y finalizacion de las votaciones
    void conex_activar();
    void act_iniciar_button();
    void act_fin_button();
    void act_regresar_button();
    void act_prop_radioButton();
    void act_moc_radioButton();

    void req_Ballot();
    void save_vote();

    //Slots de la pantalla que despliega los Resultados de las votaciones
    void conex_resultados();
    void result_resultado_button();
    void result_regresar_button();
    void result_imprimir_resumen_button();
    void result_imprimir_informe_button();
    void result_prop_radioButton();
    void result_moc_radioButton();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Configuración
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // Slot para la restauracion de la configuracion del sistema
    void restaurar_sistema();

    // Slots de la configuracion de intranet
    void conex_intranet();
    void show_interface_info();
    void intranet_aceptar_button();
    void intranet_regresar_button();


    // Slots de la configuracion de nodos
    void conex_nodos();
    void generar_pin();
    void nodos_regresar_button();
    void verificar_config_nodos();


    // Slots de la pantalla de asignación de fiscales
    void conex_fiscales();
    bool fiscal_check_pass_1(QString &pass);
    bool fiscal_check_pass_2(QString &pass);
    void fiscal_cancelar_button();
    void fiscal_aceptar_button();

    // Login
    void login_aceptar_button();

    void clear_resumen();
};

#endif // NC_H
